import tsc from "../../../utils/tsc.js"

/**
 * 根据模板数据 组装对应的标签数据
 * @param {Object} tableValue
 */
export function getTableData(tableValue) {
	let config = tableValue.config || null;
	let tables = tableValue.tables || [];
	if (tableValue.tables.length == 0) {
		throw "组装标签模板数据失败，数据入参错误！！！";
	}
	// 创建命令集
	var command = tsc.jpPrinter.createNew()
	command.setCls() //清除缓冲区，防止下一个没生效
	if (config != null) {
		// 遍历配置必须为Number
		for(let key in config){
			config[key] = parseInt(config[key]);
		}
		command.setSize(config.sizeX || 70, config.sizeY || 50) //设置标签大小，单位mm.具体参数请用尺子量一下
		command.setGap(config.gap || 2) //设置两个标签之间的间隙，单位mm.具体参数请用尺子量一下
		command.setSpeed(config.speed || 5) //速度
		command.setDensity(config.density || 8) //浓度
		command.setDirection(config.direction || 1) // 1.出纸方向，0.进纸方向
	} else if (config == null || !config.sizeX) {
		config = {
			sizeX: 70,
			sizeY: 50
		}; //默认模板打印尺寸 70mm*50mm
	}


	// 根据数据 追加数据模板
	for (let tab of tables) {
		switch (tab.templateId) {
			case 0: //配置打印机 
				break;
			case 1: //标准商品
				switch (config.sizeX) {
					case 40:
						getTemplate01_40_30(tab, command);
						break;
					case 60:
						getTemplate01_60_40(tab, command);
						break;
					case 70:
						getTemplate01_70_50(tab, command);
						break;
				}
				break;
			case 11: //商品换品
				switch (config.sizeX) {
					case 40:
						getTemplate11_40_30(tab, command);
						break;
					case 60:
						getTemplate11_60_40(tab, command);
						break;
					case 70:
						getTemplate11_70_50(tab, command);
						break;
				}
				break;
			case 21: //打印容器码模板
				switch (config.sizeX) {
					case 40:
						getTemplate21_40_30(tab, command);
						break;
					case 60:
						getTemplate21_60_40(tab, command);
						break;
					case 70:
						getTemplate21_70_50(tab, command);
						break;
				}
				break;
			case 999: //标签自检页
				getTemplate999(tab, command);
				break;
			default:
				throw "未找到指定模板ID:" + tab.templateId + " 的实现！！！";
		}
	}
	return command.getData();
}


/**
 * 毫米(mm) 转 像素(dots)
 * 1mm = 8dots
 * @param {Object} mm 毫米
 */
function mm(mm) {
	return mm * 8;
}

/**
 * 根据指定长度分割成数组
 * @param {Object} str
 * @param {Object} len
 * @param {Object} max
 */
function splitString(str, length, max) {
	const result = [];

	if (str.length > max) {
		str = str.substring(0, max - 3) + "...";
	}

	let startIndex = 0;
	while (startIndex < str.length) {
		const substr = str.substring(startIndex, startIndex + length);
		result.push(substr);
		startIndex += length;
	}

	return result;
}


/**
 * 标准商品模板01(40*30)
 * (支持组合调用 和 单独调用)
 * @param {Object} tab {count,values}
 */
function getTemplate01_40_30(tab, command = tsc.jpPrinter.createNew()) {
	let count = tab.count || 1;
	let values = tab.values || [];
	if (values.length < 10) {
		throw 'getTemplate01 values is null or unqualified error';
	}
	for (var i = 0; i < count; i++) {
		command.setCls() //清除缓冲区
		let splittedArray = splitString(values[0], 13, 24); //一行13长度，最长24
		for (var i = 0; i < splittedArray.length; i++) {
			command.setText(mm(2), mm(2 + i * 4), "TSS24.BF2", 0, 1, 1, splittedArray[i]) //绘制文字
		}
		command.setText(mm(2), mm(10), "TSS16.BF2", 0, 1, 1, values[1]) //绘制文字
		command.setText(mm(15), mm(11), "TSS24.BF2", 0, 2, 2, values[2]) //绘制文字
		command.setText(mm(11), mm(13), "TSS16.BF2", 0, 1, 1, values[3]) //绘制文字
		command.setText(mm(27), mm(26), "TSS16.BF2", 0, 1, 1, values[4]) //绘制文字
		command.setText(mm(23), mm(19), "TSS16.BF2", 0, 1, 1, values[5]) //绘制文字
		command.setBarCode(mm(2), mm(22), "128", mm(4), 1, 0, 2, 2, values[6]) //绘制code128条码
		command.setQrcode(mm(28), mm(5), "M", 4, "A", values[7]) //绘制一个二维码
		command.setText(mm(21), mm(17), "TSS16.BF2", 0, 1, 1, values[7]) //绘制文字
		command.setText(mm(2), mm(17), "TSS16.BF2", 0, 1, 1, values[8]) //绘制文字
		command.setText(mm(2), mm(19), "TSS16.BF2", 0, 1, 1, values[9]) //绘制文字
		command.setPagePrint() //执行打印指令
	}
	return command.getData();
}

function getTemplate01_60_40(tab, command = tsc.jpPrinter.createNew()) {
	let count = tab.count || 1;
	let values = tab.values || [];
	if (values.length < 10) {
		throw 'getTemplate01 values is null or unqualified error';
	}
	for (var i = 0; i < count; i++) {
		command.setCls() //清除缓冲区
		let splittedArray = splitString(values[0], 17, 29); //一行17长度，最长29
		for (var i = 0; i < splittedArray.length; i++) {
			command.setText(mm(2), mm(3 + i * 4), "TSS24.BF2", 0, 1, 1, splittedArray[i]) //绘制文字
		}
		command.setText(mm(2), mm(12), "TSS24.BF2", 0, 1, 1, values[1]) //绘制文字
		command.setText(mm(27), mm(15), "TSS24.BF2", 0, 2, 2, values[2]) //绘制文字
		command.setText(mm(20), mm(17), "TSS24.BF2", 0, 1, 1, values[3]) //绘制文字
		command.setText(mm(33), mm(35), "TSS24.BF2", 0, 1, 1, values[4]) //绘制文字
		command.setText(mm(33), mm(25), "TSS24.BF2", 0, 1, 1, values[5]) //绘制文字
		command.setBarCode(mm(2), mm(29), "128", mm(5), 1, 0, 3, 3, values[6]) //绘制code128条码
		command.setQrcode(mm(44), mm(7), "M", 5, "A", values[7]) //绘制一个二维码
		command.setText(mm(31), mm(22), "TSS24.BF2", 0, 1, 1, values[7]) //绘制文字
		command.setText(mm(2), mm(22), "TSS24.BF2", 0, 1, 1, values[8]) //绘制文字
		command.setText(mm(2), mm(25), "TSS24.BF2", 0, 1, 1, values[9]) //绘制文字
		command.setPagePrint() //执行打印指令
	}
	return command.getData();
}

function getTemplate01_70_50(tab, command = tsc.jpPrinter.createNew()) {
	let count = tab.count || 1;
	let values = tab.values || [];
	if (values.length < 10) {
		throw 'getTemplate01 values is null or unqualified error';
	}
	for (var i = 0; i < count; i++) {
		command.setCls() //清除缓冲区
		let splittedArray = splitString(values[0], 20, 35); //一行20长度，最长34
		for (var i = 0; i < splittedArray.length; i++) {
			command.setText(mm(4), mm(4 + i * 7), "TSS24.BF2", 0, 1, 2, splittedArray[i]) //绘制文字
		}
		command.setText(mm(4), mm(19), "TSS24.BF2", 0, 1, 1, values[1]) //绘制文字
		command.setText(mm(30), mm(22), "TSS24.BF2", 0, 2, 2, values[2]) //绘制文字
		command.setText(mm(22), mm(24), "TSS24.BF2", 0, 1, 1, values[3]) //绘制文字
		command.setText(mm(38), mm(45), "TSS24.BF2", 0, 1, 1, values[4]) //绘制文字
		command.setText(mm(38), mm(34), "TSS24.BF2", 0, 1, 1, values[5]) //绘制文字
		command.setBarCode(mm(4), mm(38), "128", mm(6), 1, 0, 3, 3, values[6]) //绘制code128条码
		command.setQrcode(mm(48), mm(11), "M", 5, "A", values[7]) //绘制一个二维码
		command.setText(mm(38), mm(30), "TSS24.BF2", 0, 1, 1, values[7]) //绘制文字
		command.setText(mm(4), mm(30), "TSS24.BF2", 0, 1, 1, values[8]) //绘制文字
		command.setText(mm(4), mm(34), "TSS24.BF2", 0, 1, 1, values[9]) //绘制文字
		command.setPagePrint() //执行打印指令
	}
	return command.getData();
}
/**
 * 标准换品模板11
 * (支持组合调用 和 单独调用)
 * @param {Object} tab {count,values}
 */
function getTemplate11_40_30(tab, command = tsc.jpPrinter.createNew()) {
	let count = tab.count || 1;
	let values = tab.values || [];
	if (values.length < 3) {
		throw 'getTemplate11 values is null or unqualified error';
	}
	for (var i = 0; i < count; i++) {
		command.setCls() //清除缓冲区
		command.setText(mm(5), mm(5), "TSS16.BF2", 0, 1, 1, "—————— 换品 ——————") //绘制文字
		let splittedArray = splitString(values[0], 10, 20); //一行10长度，最长20
		for (var i = 0; i < splittedArray.length; i++) {
			command.setText(mm(6), mm(8 + i * 4), "TSS24.BF2", 0, 1, 1, splittedArray[i]) //绘制文字
		}
		command.setText(mm(13), mm(17), "TSS16.BF2", 0, 1, 1, values[1]) //绘制文字
		command.setText(mm(5), mm(21), "TSS16.BF2", 0, 1, 1, "———————————————") //绘制文字
		command.setText(mm(13), mm(24), "TSS16.BF2", 0, 1, 1, values[2]) //绘制文字
		command.setPagePrint() //执行打印指令
	}
	return command.getData();
}
/**
 * 标准换品模板11(60*40)
 * (支持组合调用 和 单独调用)
 * @param {Object} tab {count,values}
 */
function getTemplate11_60_40(tab, command = tsc.jpPrinter.createNew()) {
	let count = tab.count || 1;
	let values = tab.values || [];
	if (values.length < 3) {
		throw 'getTemplate11 values is null or unqualified error';
	}
	for (var i = 0; i < count; i++) {
		command.setCls() //清除缓冲区
		command.setText(mm(7), mm(6), "TSS24.BF2", 0, 1, 1, "—————— 换品 ——————") //绘制文字
		let splittedArray = splitString(values[0], 15, 30); //一行15长度，最长30
		for (var i = 0; i < splittedArray.length; i++) {
			command.setText(mm(9), mm(12 + i * 4), "TSS24.BF2", 0, 1, 1, splittedArray[i]) //绘制文字
		}
		command.setText(mm(19), mm(24), "TSS24.BF2", 0, 1, 1, values[1]) //绘制文字
		command.setText(mm(7), mm(28), "TSS24.BF2", 0, 1, 1, "———————————————") //绘制文字
		command.setText(mm(19), mm(32), "TSS24.BF2", 0, 1, 1, values[2]) //绘制文字
		command.setPagePrint() //执行打印指令
	}
	return command.getData();
}

/**
 * 标准换品模板11(70*50)
 * (支持组合调用 和 单独调用)
 * @param {Object} tab {count,values}
 */
function getTemplate11_70_50(tab, command = tsc.jpPrinter.createNew()) {
	let count = tab.count || 1;
	let values = tab.values || [];
	if (values.length < 3) {
		throw 'getTemplate11 values is null or unqualified error';
	}
	for (var i = 0; i < count; i++) {
		command.setCls() //清除缓冲区
		command.setText(mm(11), mm(7), "TSS24.BF2", 0, 1, 1, "—————— 换品 ——————") //绘制文字
		let splittedArray = splitString(values[0], 15, 30); //一行15长度，最长30
		for (var i = 0; i < splittedArray.length; i++) {
			command.setText(mm(13), mm(13 + i * 7), "TSS24.BF2", 0, 1, 2, splittedArray[i]) //绘制文字
		}
		command.setText(mm(23), mm(30), "TSS24.BF2", 0, 1, 1, values[1]) //绘制文字
		command.setText(mm(11), mm(37), "TSS24.BF2", 0, 1, 1, "———————————————") //绘制文字
		command.setText(mm(23), mm(42), "TSS24.BF2", 0, 1, 1, values[2]) //绘制文字
		command.setPagePrint() //执行打印指令
	}
	return command.getData();
}
/**
 * 打印容器码模板21(40*30)
 * (支持组合调用 和 单独调用)
 * @param {Object} tab {count,values}
 */
function getTemplate21_40_30(tab, command = tsc.jpPrinter.createNew()) {
	let count = tab.count || 1;
	let values = tab.values || [];
	if (values.length < 1) {
		throw 'getTemplate21 values is null or unqualified error';
	}
	for (var i = 0; i < count; i++) {
		command.setCls() //清除缓冲区
		command.setText(mm(17), mm(4), "TSS24.BF2", 0, 1, 1, "容器码") //绘制文字
		command.setQrcode(mm(14), mm(8), "M", 5, "A", values[0]) //绘制一个二维码
		command.setText(mm(10), mm(23), "TSS24.BF2", 0, 1, 1, values[0]) //绘制文字
		command.setPagePrint() //执行打印指令
	}
	return command.getData();
}

/**
 * 打印容器码模板21(60*40)
 * (支持组合调用 和 单独调用)
 * @param {Object} tab {count,values}
 */
function getTemplate21_60_40(tab, command = tsc.jpPrinter.createNew()) {
	let count = tab.count || 1;
	let values = tab.values || [];
	if (values.length < 1) {
		throw 'getTemplate21 values is null or unqualified error';
	}
	for (var i = 0; i < count; i++) {
		command.setCls() //清除缓冲区
		command.setText(mm(25), mm(5), "TSS24.BF2", 0, 1, 1, "容器码") //绘制文字
		command.setQrcode(mm(21), mm(10), "M", 6, "A", values[0]) //绘制一个二维码
		command.setText(mm(18), mm(30), "TSS24.BF2", 0, 1, 1, values[0]) //绘制文字
		command.setPagePrint() //执行打印指令
	}
	return command.getData();
}

/**
 * 打印容器码模板21(70*50)
 * (支持组合调用 和 单独调用)
 * @param {Object} tab {count,values}
 */
function getTemplate21_70_50(tab, command = tsc.jpPrinter.createNew()) {
	let count = tab.count || 1;
	let values = tab.values || [];
	if (values.length < 1) {
		throw 'getTemplate21 values is null or unqualified error';
	}
	for (var i = 0; i < count; i++) {
		command.setCls() //清除缓冲区
		command.setText(mm(30), mm(8), "TSS24.BF2", 0, 1, 1, "容器码") //绘制文字
		command.setQrcode(mm(25), mm(15), "M", 7, "A", values[0]) //绘制一个二维码
		command.setText(mm(24), mm(36), "TSS24.BF2", 0, 1, 1, values[0]) //绘制文字
		command.setPagePrint() //执行打印指令
	}
	return command.getData();
}
/**
 * 标签自检页999
 * (支持组合调用 和 单独调用)
 * @param {Object} tab {count,values}
 */
function getTemplate999(tab, command = tsc.jpPrinter.createNew()) {
	let count = tab.count || 1;
	for (var i = 0; i < count; i++) {
		command.setCls() //清除缓冲区
		command.setSelfTest(); //标签自检页
		command.setPagePrint() //执行打印指令
	}
	return command.getData();
}



// -------------------------------------------------  备用模板
/**
 * 商品模板00 (带价格) (40*30)
 * (支持组合调用 和 单独调用)
 * @param {Object} tab {count,values}
 */
function getTemplate00(tab, command = tsc.jpPrinter.createNew()) {
	let count = tab.count || 1;
	let values = tab.values || [];
	if (values.length < 10) {
		throw 'getTemplate01 values is null or unqualified error';
	}
	for (var i = 0; i < count; i++) {
		command.setCls() //清除缓冲区
		command.setText(mm(6), mm(2), "TSS24.BF2", 0, 1, 1, values[0]) //绘制文字
		command.setText(mm(2), mm(7), "TSS16.BF2", 0, 1, 1, values[1]) //绘制文字
		command.setText(mm(2), mm(10), "TSS16.BF2", 0, 1, 1, values[2]) //绘制文字
		command.setText(mm(2), mm(14), "TSS16.BF2", 0, 1, 1, values[3]) //绘制文字
		command.setText(mm(2), mm(17), "TSS24.BF2", 0, 1, 1, values[4]) //绘制文字
		command.setBarCode(mm(2), mm(21), "128", mm(5), 1, 0, 2, 2, values[5]) //绘制code128条码
		command.setQrcode(mm(23), mm(1), "M", 5, "A", values[6]) //绘制一个二维码
		command.setText(mm(22), mm(15), "TSS16.BF2", 0, 1, 1, values[7]) //绘制文字
		command.setText(mm(22), mm(18), "TSS16.BF2", 0, 1, 1, values[8]) //绘制文字
		command.setText(mm(21), mm(27), "TSS16.BF2", 0, 1, 1, values[9]) //绘制文字
		command.setPagePrint() //执行打印指令
	}
	return command.getData();
}


/**
 * 测试模板101
 * @param {Object} tableValue
 */
function getTemplateTEST101(tableValue) {
	let {
		config,
		values
	} = tableValue;
	var command = tsc.jpPrinter.createNew()
	command.setCls() //清除缓冲区，防止下一个没生效
	command.setSize(config.sizeX, config.sizeY) //设置标签大小，单位mm.具体参数请用尺子量一下
	command.setGap(config.gap) //设置两个标签之间的间隙，单位mm.具体参数请用尺子量一下
	command.setCls() //清除缓冲区
	command.setBox(10, 10, 464, 230, 5) //绘制一个边框
	command.setBar(10, 75, 455, 5); //绘制一条黑线
	command.setText(150, 20, "TSS24.BF2", 0, 2, 2, values[0]) //绘制文字
	command.setText(340, 20, "TSS24.BF2", 0, 2, 2, values[1]) //绘制文字
	command.setText(360, 40, "TSS24.BF2", 0, 1, 1, values[2]) //绘制文字
	command.setText(50, 100, "TSS24.BF2", 0, 1, 1, values[3]) //绘制文字
	command.setText(140, 90, "TSS24.BF2", 0, 1, 1, values[4]) //绘制文字
	command.setText(50, 140, "TSS24.BF2", 0, 1, 1, values[5]) //绘制文字
	command.setText(140, 130, "TSS24.BF2", 0, 1, 1, values[6]) //绘制文字
	command.setText(50, 170, "TSS24.BF2", 0, 1, 1, values[7]) //绘制文字
	command.setBarCode(120, 170, "128", 48, 0, 0, 2, 2, values[8]) //绘制code128条码
	command.setBar(300, 80, 5, 150); //绘制一条黑线
	command.setQrcode(320, 90, "L", 5, "A", values[9]) //绘制一个二维码
	command.setPagePrint() //执行打印指令
	return command.getData();
}